<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
                      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8"/>
    <title>Uso Avan&ccedil;ado de Zend_Layout - Zend Framework Manual</title>

    <link href="../css/shCore.css" rel="stylesheet" type="text/css" />
    <link href="../css/shThemeDefault.css" rel="stylesheet" type="text/css" />
    <link href="../css/styles.css" media="all" rel="stylesheet" type="text/css" />
</head>
<body>
<h1>Zend Framework</h1>
<h2>Programmer's Reference Guide</h2>
<ul>
    <li><a href="../en/zend.layout.advanced.html">Inglês (English)</a></li>
    <li><a href="../pt-br/zend.layout.advanced.html">Português Brasileiro (Brazilian Portuguese)</a></li>
</ul>
<table width="100%">
    <tr valign="top">
        <td width="85%">
            <table width="100%">
                <tr>
                    <td width="25%" style="text-align: left;">
                    <a href="zend.layout.options.html">Op&ccedil;&otilde;es de Configura&ccedil;&atilde;o Zend_Layout</a>
                    </td>

                    <td width="50%" style="text-align: center;">
                        <div class="up"><span class="up"><a href="zend.layout.html">Zend_Layout</a></span><br />
                        <span class="home"><a href="manual.html">Guia de Refer&ecirc;ncia do Programador</a></span></div>
                    </td>

                    <td width="25%" style="text-align: right;">
                        <div class="next" style="text-align: right; float: right;"><a href="zend.ldap.html">Zend_Ldap</a></div>
                    </td>
                </tr>
            </table>
<hr />
<div id="zend.layout.advanced" class="section"><div class="info"><h1 class="title">Uso Avançado de Zend_Layout</h1></div>
    

    <p class="para">
        <span class="classname">Zend_Layout</span> tem um número de casos de uso para o desenvolvedor
        que deseja adaptá-lo para diferentes implementações de view, layouts de sistema de
        arquivos, e mais.
    </p>

    <p class="para">
        Os principais pontos de extensão são:
    </p>

    <ul class="itemizedlist">
        <li class="listitem">
            <p class="para">
                <em class="emphasis">Custom view objects</em>.
                <span class="classname">Zend_Layout</span> permite a você utilizar qualquer classe que
                implemente <span class="classname">Zend_View_Interface</span>.
            </p>
        </li>

        <li class="listitem">
            <p class="para">
                <em class="emphasis">Custom front controller plugins</em>.
                <span class="classname">Zend_Layout</span> vem embarcado com um front controller plugin
                padrão que automatiza a renderização de layouts antes de retornar a resposta.
                Você pode substituir por seu próprio plugin.
            </p>
        </li>

        <li class="listitem">
            <p class="para">
                <em class="emphasis">Custom action helpers</em>.
                <span class="classname">Zend_Layout</span> vem embarcado com um action helper padrão que
                deve servir para a maioria das necessidades já que é um proxy mudo para o próprio
                objeto de layout.
            </p>
        </li>

        <li class="listitem">
            <p class="para">
                <em class="emphasis">Custom layout script path resolution</em>.
                <span class="classname">Zend_Layout</span> permite a você usar seu próprio
                <a href="zend.filter.inflector.html" class="link">inflector</a> para resolução do
                caminho do script de layout, ou simplesmente modificar o inflector
                anexado para especificar suas próprias regras de inflexão.
            </p>
        </li>
    </ul>

    <div class="section" id="zend.layout.advanced.view"><div class="info"><h1 class="title">Objetos View Customizados</h1></div>
        

        <p class="para">
            <span class="classname">Zend_Layout</span> permite a você usar qualquer classe
            que implemente <span class="classname">Zend_View_Interface</span> ou estenda
            <span class="classname">Zend_View_Abstract</span> para renderizar seu script de layout.
            Simplesmente passe seu objeto view customizado como um parâmetro para
            o construtor/ <span class="methodname">startMvc()</span>, ou configure o
            usando o acessor  <span class="methodname">setView()</span>:
        </p>

        <pre class="programlisting brush: php">
$view = new My_Custom_View();
$layout-&gt;setView($view);
</pre>


        <blockquote class="note"><p><b class="note">Note</b>: <span class="info"><b>Nem todas as implementações de Zend_View são iguais</b><br /></span>
            

            <p class="para">
                Enquanto <span class="classname">Zend_Layout</span> permite que você use qualquer
                classe que implemente <span class="classname">Zend_View_Interface</span>, você pode
                entrar bem se elas não puderem utilizar os vários helpers
                <span class="classname">Zend_View</span>, particularmente os helpers layout e
                <a href="zend.view.helpers.html#zend.view.helpers.initial.placeholder" class="link">placeholder</a>. Isso
                ocorre porque <span class="classname">Zend_Layout</span> torna o conjunto de variáveis
                no objeto disponível via ele mesmo e
                <a href="zend.view.helpers.html#zend.view.helpers.initial.placeholder" class="link">placeholders</a>.
            </p>

            <p class="para">
                Se você precisa usar uma implementação customizada de
                <span class="classname">Zend_View</span> que não suporta esses helpers, você precisará
                descobrir um modo de obter as variáveis de layout para o view. Isso pode
                ser feito ou pela extensão do objeto <span class="classname">Zend_Layout</span> com
                alteração do método  <span class="methodname">render()</span> para passar variáveis
                para o view, ou criando sua própria classe plugin
                que as passa antes de renderizar o layout.
            </p>

            <p class="para">
                Alternativamente, se sua implementação de view suporta qualquer espécie de
                capacidade do plugin, você pode acessar as variáveis por meio do placeholder
                &#039;Zend_Layout&#039; usando o <a href="zend.view.helpers.html#zend.view.helpers.initial.placeholder" class="link">helper
                    placeholder</a>:
            </p>

            <pre class="programlisting brush: php">
$placeholders = new Zend_View_Helper_Placeholder();
$layoutVars   = $placeholders-&gt;placeholder(&#039;Zend_Layout&#039;)-&gt;getArrayCopy();
</pre>

        </p></blockquote>
    </div>

    <div class="section" id="zend.layout.advanced.plugin"><div class="info"><h1 class="title">Plugins Front Controller Customizados</h1></div>
        

        <p class="para">
            Quando o usamos com os componentes <acronym class="acronym">MVC</acronym>,
            <span class="classname">Zend_Layout</span> registra um plugin front controller que renderiza o
            layout como a última ação antes de abandonar o laço de despacho. Na maioria dos casos, o
            plugin padrão servirá, mas você se você desejar escrever o seu próprio, você pode
            especificar o nome da classe plugin a ser carregada carregar pela passagem da opção
            <span class="property">pluginClass</span> ao método  <span class="methodname">startMvc()</span>.
        </p>

        <p class="para">
            Qualquer classe plugin que você escrever para esse propósito precisará estender
            <span class="classname">Zend_Controller_Plugin_Abstract</span>, e deverá aceitar uma instância
            de objeto layout como um argumento para o construtor. Caso contrário, os detalhes de sua
            implementação ficarão acima de você.
        </p>

        <p class="para">
            A classe plugin padrão usada é
            <span class="classname">Zend_Layout_Controller_Plugin_Layout</span>.
        </p>
    </div>

    <div class="section" id="zend.layout.advanced.helper"><div class="info"><h1 class="title">Action Helpers Customizados</h1></div>
        

        <p class="para">
            Quando o usamos com componentes <acronym class="acronym">MVC</acronym>,
            <span class="classname">Zend_Layout</span> registra um helper action controller com o helper
            broker. O helper padrão,
            <span class="classname">Zend_Layout_Controller_Action_Helper_Layout</span>, age como um proxy
            mudo para a própria instância do objeto de layout, e deve servir para a maioria dos
            casos de uso.
        </p>

        <p class="para">
            Se você sentir necessidade de escrever funcionalidades customizadas, simplesmente
            escreva uma classe action helper estendendo
            <span class="classname">Zend_Controller_Action_Helper_Abstract</span> e passe o nome da classe
            como uma opção <span class="property">helperClass</span> para o método
             <span class="methodname">startMvc()</span>. Detalhes da implementação ficarão acima de você.
        </p>
    </div>

    <div class="section" id="zend.layout.advanced.inflector"><div class="info"><h1 class="title">Resolução de Caminho de Script de Layout Customizada: Usando o Inflector</h1></div>
        

        <p class="para">
            <span class="classname">Zend_Layout</span> usa <span class="classname">Zend_Filter_Inflector</span>
            para estabelecer uma cadeia de filtro para traduzir um nome de layout para caminho
            de script de layout. Por padrão, ela usa as regras &#039;Word_CamelCaseToDash&#039; seguida
            por &#039;StringToLower&#039;, e o sufixo &#039;phtml&#039; para transformar o nome em um caminho.
            Alguns exemplos:
        </p>

        <ul class="itemizedlist">
            <li class="listitem">
                <p class="para">&#039;foo&#039; será transformado em &#039;foo.phtml&#039;.</p>
            </li>

            <li class="listitem">
                <p class="para">&#039;FooBarBaz&#039; será transformado em &#039;foo-bar-baz.phtml&#039;.</p>
            </li>
        </ul>

        <p class="para">
            Você tem três opções para modificar inflexão: modificar o alvo de inflexão
            e/ou sufixo da view via acessores de <span class="classname">Zend_Layout</span>, modificar
            as regras do inflector e alvo do inflector associado com a instância
            <span class="classname">Zend_Layout</span>, ou criar sua própria instância de inflector
            e passá-la para  <span class="methodname">Zend_Layout::setInflector()</span>.
        </p>

        <div class="example" id="zend.layout.advanced.inflector.accessors"><div class="info"><p><b>Example #1 Usando acessores Zend_Layout para modificar o inflector</b></p></div>
            

            <div class="example-contents"><p>
                O inflector <span class="classname">Zend_Layout</span> padrão usa referências estáticas
                para o alvo e sufixo de view script, e tem acessores para configurar esses valores.
            </p></div>

            <pre class="programlisting brush: php">
// Configure o alvo do inflector:
$layout-&gt;setInflectorTarget(&#039;layouts/:script.:suffix&#039;);

// Configura o sufixo do view script de layout:
$layout-&gt;setViewSuffix(&#039;php&#039;);
</pre>

        </div>

        <div class="example" id="zend.layout.advanced.inflector.directmodification"><div class="info"><p><b>Example #2 Modificação direta do inflector Zend_Layout</b></p></div>
            

            <div class="example-contents"><p>
                Inflectores tem um alvo e uma ou mais regras. O alvo padrão usado com
                <span class="classname">Zend_Layout</span> é &#039;:script.:suffix&#039;; &#039;:script&#039; passa o nome
                do layout registrado, enquanto &#039;:suffix&#039; é uma regra estática do inflector.
            </p></div>

            <div class="example-contents"><p>
                Digamos que você queira que o script de layout termine no sufixo &#039;html&#039;,
                e que você queira separar palavras MixedCase e camelCased com underscores
                ao invés de hífens, e não deixe o nome em caixa baixa. Adicionalmente,
                você quer procurar em um subdiretório &#039;layouts&#039; pelo script.
            </p></div>

            <pre class="programlisting brush: php">
$layout-&gt;getInflector()-&gt;setTarget(&#039;layouts/:script.:suffix&#039;)
                       -&gt;setStaticRule(&#039;suffix&#039;, &#039;html&#039;)
                       -&gt;setFilterRule(array(&#039;Word_CamelCaseToUnderscore&#039;));
</pre>

        </div>

        <div class="example" id="zend.layout.advanced.inflector.custom"><div class="info"><p><b>Example #3 Inflectores Customizados</b></p></div>
            

            <div class="example-contents"><p>
                Na maioria dos casos, modificar o inflector existente será suficiente.
                Entretanto, você pode ter um inflector que você deseja usar em diversos
                lugares, com diferentes objetos de diferentes tipos.
                <span class="classname">Zend_Layout</span> suporta isso.
            </p></div>

            <pre class="programlisting brush: php">
$inflector = new Zend_Filter_Inflector(&#039;layouts/:script.:suffix&#039;);
$inflector-&gt;addRules(array(
    &#039;:script&#039; =&gt; array(&#039;Word_CamelCaseToUnderscore&#039;),
    &#039;suffix&#039;  =&gt; &#039;html&#039;
));
$layout-&gt;setInflector($inflector);
</pre>

        </div>

        <blockquote class="note"><p><b class="note">Note</b>: <span class="info"><b>Inflexão pode ser desabilitada</b><br /></span>
            

            <p class="para">
                Inflexão pode ser desabilitada e habilitada usando acessores no objeto
                <span class="classname">Zend_Layout</span>. Isso pode ser útil se você quiser especificar
                um caminho absoluto para um view script de layout, ou saber que o mecanismo
                que você usará para especificar o script de layout não precisa de inflexão.
                Simplesmente use os métodos  <span class="methodname">enableInflector()</span> e
                 <span class="methodname">disableInflector()</span>.
            </p>
        </p></blockquote>
    </div>
</div>
        <hr />

            <table width="100%">
                <tr>
                    <td width="25%" style="text-align: left;">
                    <a href="zend.layout.options.html">Op&ccedil;&otilde;es de Configura&ccedil;&atilde;o Zend_Layout</a>
                    </td>

                    <td width="50%" style="text-align: center;">
                        <div class="up"><span class="up"><a href="zend.layout.html">Zend_Layout</a></span><br />
                        <span class="home"><a href="manual.html">Guia de Refer&ecirc;ncia do Programador</a></span></div>
                    </td>

                    <td width="25%" style="text-align: right;">
                        <div class="next" style="text-align: right; float: right;"><a href="zend.ldap.html">Zend_Ldap</a></div>
                    </td>
                </tr>
            </table>
</td>
        <td style="font-size: smaller;" width="15%"> <style type="text/css">
#leftbar {
	float: left;
	width: 186px;
	padding: 5px;
	font-size: smaller;
}
ul.toc {
	margin: 0px 5px 5px 5px;
	padding: 0px;
}
ul.toc li {
	font-size: 85%;
	margin: 1px 0 1px 1px;
	padding: 1px 0 1px 11px;
	list-style-type: none;
	background-repeat: no-repeat;
	background-position: center left;
}
ul.toc li.header {
	font-size: 115%;
	padding: 5px 0px 5px 11px;
	border-bottom: 1px solid #cccccc;
	margin-bottom: 5px;
}
ul.toc li.active {
	font-weight: bold;
}
ul.toc li a {
	text-decoration: none;
}
ul.toc li a:hover {
	text-decoration: underline;
}
</style>
 <ul class="toc">
  <li class="header home"><a href="manual.html">Guia de Refer&ecirc;ncia do Programador</a></li>
  <li class="header up"><a href="manual.html">Guia de Refer&ecirc;ncia do Programador</a></li>
  <li class="header up"><a href="reference.html">Refer&ecirc;ncia do Zend Framework</a></li>
  <li class="header up"><a href="zend.layout.html">Zend_Layout</a></li>
  <li><a href="zend.layout.introduction.html">Introdu&ccedil;&atilde;o</a></li>
  <li><a href="zend.layout.quickstart.html">Guia R&aacute;pido Zend_Layout</a></li>
  <li><a href="zend.layout.options.html">Op&ccedil;&otilde;es de Configura&ccedil;&atilde;o Zend_Layout</a></li>
  <li class="active"><a href="zend.layout.advanced.html">Uso Avan&ccedil;ado de Zend_Layout</a></li>
 </ul>
 </td>
    </tr>
</table>

<script type="text/javascript" src="../js/shCore.js"></script>
<script type="text/javascript" src="../js/shAutoloader.js"></script>
<script type="text/javascript" src="../js/main.js"></script>

</body>
</html>